package cliente;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JPanel;




//Cliente Sencillo que se conecta con el servidor y envia coordenadas
// x,y indicando en que posicion quiere dibujar el circulo

public class Cliente1 extends JPanel{
	
	static final int RADIO = 20; 
	static final String HOST = "localhost"; 
	static final int PUERTO=5000; //puerto en el cual recibe el servidor
	Socket skCliente;             //socket mediante el cual me conecto al servidor 
	DataInputStream flujoEntrada; 
	DataOutputStream flujoSalida;
	
	
	int x;
	int y;
	
	
	public Cliente1(){		
		
		//para que la elipse que pinta no se vea la primera vez 
		x=-20;
		y=-20; 
		
		addMouseListener(new mouseListener());

		//Establecer la conexion con el servidor
		try{		
			skCliente = new Socket( HOST , PUERTO );
			
			InputStream aux = skCliente.getInputStream();
			//genera el flujo de entrada, por aca RECIBO los mensajes que envie el servidor
			flujoEntrada = new DataInputStream( aux );
			
			OutputStream aux1 = skCliente.getOutputStream();
			//genera el flujo de salida, por aca se ENVIAN los menajes al servidor
			flujoSalida= new DataOutputStream( aux1 );
			
			//Creo un hilo que escuche los mensajes del servidor
			Runnable escuchaServidor = new HiloEscuchaServidor();
			Thread hilo = new Thread(escuchaServidor);
			hilo.start();	
			System.out.println("LLEGO UN CLIENTE");
			
			
			} catch( Exception e ) {
			
			System.out.println( e.getMessage() +"ERROR");
			
			}
		
		
		
		
	}
	
	
	
	@Override
	public void paint(Graphics g) {
		g.clearRect(0, 0, 500, 500);
		
		g.setColor(Color.blue);
		String s = new String("HAZ CLICK ");
		
		g.drawString(s,10,10);
		g.setColor(Color.green);
		g.fillOval(x-(RADIO/2), y-(RADIO/2), RADIO, RADIO);
		g.setColor(Color.BLACK);
		g.drawOval(x-(RADIO/2), y-(RADIO/2), RADIO, RADIO);
		
		g.drawLine((x)+-5,(y), (x)+5, (y));
		g.drawLine((x), (y)-5, (x), (y)+5);
		
	}

	
	private class HiloEscuchaServidor implements Runnable{

		@Override
		public void run() {
			//escucho permanentemente los mensajes del servidor
			while(true){
				try {
					//Asumo que el servidor primero envia la coordenada X y luego la Y
					x=Integer.parseInt(flujoEntrada.readUTF());
					y=Integer.parseInt(flujoEntrada.readUTF());
					
					System.out.println("CLIENTE: X: "+x+" Y: "+y);
					//finalmete despues de haber recibio las coordenas vuelvo a pintarme con las nuevas corrdenadas
					repaint();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
		}
		
	}

	private class mouseListener implements MouseListener{

		@Override
		public void mouseClicked(MouseEvent e) {
			//Cuando hacen click en mi obtengo donde me hicieron click me pinto de una vez
			// y envio el mensaje al servidor
			x=e.getX();
			y=e.getY();
			repaint();
			
			try {
				//se envian las coordenadas
				flujoSalida.writeUTF(""+x);
				flujoSalida.writeUTF(""+y);
			
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
		}

		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
	}
	
	
	
	
	public static void main( String[] arg ) {
		JFrame frame = new JFrame("Cliente 1");
		Cliente1 cliente = new Cliente1();
		frame.add(cliente);
		frame.setVisible(true);
		frame.setSize(200,200);
		cliente.grabFocus();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
}
